package online.webssh.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
 * 验证码生成器类，可生成数字、大写、小写字母及三者混合类型的验证码。
 * 支持自定义验证码字符数量；
 * 支持自定义验证码图片的大小；
 * 支持自定义需排除的特殊字符；
 * 支持自定义干扰线的数量；
 * 支持自定义验证码图文颜色
 */
public class SecurityImage {
	     /**
	       * 生成验证码图片
	       * @param securityCode   验证码字符
	       * @return  BufferedImage  图片
	      */
	     public static BufferedImage createImage(String securityCode){
	         //验证码长度
	         int codeLength=securityCode.length();
	         //字体大小
	        int fSize = 15;
	          int fWidth = fSize + 1;
	         //图片宽度
	         int width = codeLength * fWidth + 20 ;
	         //图片高度
	         int height = fSize * 2 + 1;
	          //图片
	          BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	          Graphics g=image.createGraphics();
	         //设置背景色
	          g.setColor(Color.WHITE);
	           //填充背景
	          g.fillRect(0, 0, width, height);
	           //设置边框颜色
	          g.setColor(Color.LIGHT_GRAY);
	           //边框字体样式
	          g.setFont(new Font("Arial", Font.BOLD, height - 2));
	           //绘制边框
	          g.drawRect(0, 0, width - 1, height -1);
	           //绘制噪点
	          Random rand = new Random();
	           //设置噪点颜色
	           g.setColor(Color.LIGHT_GRAY);
	           for(int i = 0;i < codeLength * 6;i++){
	               int x = rand.nextInt(width);
	               int y = rand.nextInt(height);
	              //绘制1*1大小的矩形
	               g.drawRect(x, y, 1, 1);
	           }
	          //绘制验证码
	         int codeY = height - 10;  
	          //设置字体颜色和样式
	           //g.setColor(new Color(19,148,246));
	           g.setFont(new Font("Georgia", Font.BOLD, fSize));
	           Random random = new Random();
	           for(int i = 0; i < codeLength;i++){
	        	   g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
	               g.drawString(String.valueOf(securityCode.charAt(i)), i * (random.nextInt(20)%(20-16+1) + 16) + 5, codeY);
	          }
	           //关闭资源
	           g.dispose();
	           return image;
	       }
	       /**
	       * 返回验证码图片的流格式
	       * @param securityCode  验证码
	        * @return ByteArrayInputStream 图片流
	        */
	       public static ByteArrayInputStream getImageAsInputStream(String securityCode){
	         BufferedImage image = createImage(securityCode);
	          return convertImageToStream(image);
	      }
	      /**
	        * 将BufferedImage转换成ByteArrayInputStream
	        * @param image  图片
	        * @return ByteArrayInputStream 流
	        */
	       private static ByteArrayInputStream convertImageToStream(BufferedImage image){
	         ByteArrayInputStream inputStream = null;
	          ByteArrayOutputStream bos = new ByteArrayOutputStream();
	          JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);
	          try {
	              jpeg.encode(image);
	              byte[] bts = bos.toByteArray();
	              inputStream = new ByteArrayInputStream(bts);
	         } catch (ImageFormatException e) {
	              e.printStackTrace();
         } catch (IOException e) {
	             e.printStackTrace();
	         }
	         return inputStream;
	     }
}
